package cn.fintecher.pangolin.service.common.web;


import cn.fintecher.pangolin.common.enums.EnumMessage;
import cn.fintecher.pangolin.common.model.DataDict;
import cn.fintecher.pangolin.common.model.DataDictModel;
import cn.fintecher.pangolin.common.web.BaseController;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;

import java.util.*;

/**
 * Created by ChenChang on 2017/10/11.
 */
@RestController
@RequestMapping("/api/dataDict")
@Api(value = "数据字典相关", description = "数据字典相关")
public class DataDictController extends BaseController {

    private final Logger log = LoggerFactory.getLogger(DataDictController.class);

    @Autowired
    private MessageSource messageSource;

    @ApiOperation(value = "获取数据字典", notes = "获取数据字典")
    @GetMapping("/getAll")
    public ResponseEntity<Map<String, Collection<DataDict>>> getAll(WebRequest request) throws ClassNotFoundException {
        log.info("获取数据字典项目 local为：{}", request.getLocale());
        Multimap<String, DataDict> dictMultimap = ArrayListMultimap.create();
        List<Class<?>> list = new ArrayList<>();
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AddressType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AddressStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ApplyFileContent"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ApprovalResult"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ApprovalStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AreaType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AssistStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CaseDataStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CommentType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.DistributeWay"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.FollowType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ImportDataExcelStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ManagementType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Marital"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.FindType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OperatorState"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OrganizationType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OtherFollowType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PayStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PhoneStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PhoneType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PublicCaseStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Relationship"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ResourceType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Sex"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.SocialNetwork"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.StrategyType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Symbol"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Target"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.TemplateType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OtherTemplateType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CaseLeaveFlag"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.Source"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CollectionOrganization"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ExportState"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OrganizationApproveType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.UserState"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.MessageMode"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.MessageReadStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.MessageType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.TaskBoxStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.TaskBoxType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.NoticeType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ExportTemplateType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.SensitiveLevel"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.DeviceType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.State"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CardFlag"));

        list.add(Class.forName("cn.fintecher.pangolin.common.enums.OtherLetterTemplateType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.BillType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.WorkOrderOperationType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PublicCaseFlag"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.PublicField"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.FieldInput"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.BanState"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.SupervisorState"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CasePool"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.RecodingType"));

        list.add(Class.forName("cn.fintecher.pangolin.common.enums.BaseSelect"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.BaseStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.UserStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.DepartmentType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AccountType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ImportTemplateType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ContactResult"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.StrategyDistributeType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.StatusType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ContactStatus"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.FlowType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.AssistCategory"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ApprovalStage"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.ReportType"));
        list.add(Class.forName("cn.fintecher.pangolin.common.enums.CaseType"));
        for (Class<?> l : list) {

            Class c = Class.forName(l.getName());
            if (Objects.isNull(c.getEnumConstants())) {
                continue;
            }
            for (Object obj : c.getEnumConstants()) {
                try {
                    DataDict dataDict = new DataDict(((Enum<?>) obj).name(), messageSource.getMessage(((EnumMessage) obj).getMessageKey((Enum<?>) obj), null, Locale.CHINA));
                    dictMultimap.put(c.getSimpleName(), dataDict);
                } catch (Exception e) {
                    log.error(e.getMessage(), e);
                }
            }
        }
        return ResponseEntity.ok().body(dictMultimap.asMap());
    }


    @ApiOperation(value = "获取单个数据字典", notes = "获取单个数据字典")
    @PostMapping("/getOneDataDict")
    public ResponseEntity<String> getOneDataDict(@RequestBody DataDictModel model) throws ClassNotFoundException {
        log.info("获取单个数据字典：{}", model);
        Class c = Class.forName("cn.fintecher.pangolin.common.enums.".concat(model.getClassName()));
        String name = null;
        for (Object obj : c.getEnumConstants()) {
            try {
                DataDict dataDict = new DataDict(((Enum<?>) obj).name(), messageSource.getMessage(((EnumMessage) obj).getMessageKey((Enum<?>) obj), null, Locale.CHINA));
                if (dataDict.getCode().equals(model.getCode())) {
                    name = dataDict.getName();
                    break;
                }
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
        return ResponseEntity.ok().body(name);
    }

    @ApiOperation(value = "获取单个数据字典", notes = "获取单个数据字典")
    @GetMapping("/getDataDict")
    public ResponseEntity<List<DataDictModel>> getDataDict(@RequestParam String enumName) throws ClassNotFoundException {
        log.info("获取单个数据字典：{}", enumName);
        Class c = Class.forName("cn.fintecher.pangolin.common.enums.".concat(enumName));
        List<DataDictModel> result = new ArrayList<>();
        for (Object obj : c.getEnumConstants()) {
            try {
                DataDict dataDict = new DataDict(((Enum<?>) obj).name(), messageSource.getMessage(((EnumMessage) obj).getMessageKey((Enum<?>) obj), null, Locale.CHINA));
                DataDictModel model = new DataDictModel();
                model.setCode(dataDict.getCode());
                model.setName(dataDict.getName());
                result.add(model);
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
        return ResponseEntity.ok().body(result);
    }
}
